package com.zch.starter.opentelemetry.code.mode.springboot.starter.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.io.ClassPathResource;

import java.io.IOException;
import java.util.Properties;
// 该类只负责先把配置文件里的配置加载到spring 的环境上下文中
/**
 * 该类 执行 是属于环境上下文准备阶段 如果有配置文件用了占位符${} 此时还不会解析的！要到bean创建阶段才会解析
 * 环境上下文准备阶段--》条件检测阶段-》配置类解析阶段-->bean创建阶段--》属性注入阶段
 * 把opentelemetry-zch.properties 文件加载到环境上下文中Environment，这样代码中就可以@Value${} 从环境上下文中获取，或者 注入Environment 来代码获取
 */
public class OpentelemetryCustomPropertyLoader implements EnvironmentPostProcessor {
    //执行时 application.properties 已经执行好了
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        //StandardServletEnvironment 表示web项目
        try {
            // 加载自定义属性文件
            Properties properties = new Properties();
            properties.load(new ClassPathResource("opentelemetry-zch.properties").getInputStream());
            // 将属性添加到环境变量中 插到队尾 确保业务应用层的application文件里自定义属性具有最高优先级，当然如果业务没有配置属性 那么就以该jar里的为准
            environment.getPropertySources().addLast(
                    new PropertiesPropertySource("opentelemetryCustomProperties", properties));

        } catch (IOException e) {
            throw new RuntimeException("Failed to load custom properties", e);
        }
    }
}
